#ifndef B2D_VERTEXBUFFER_H
#define B2D_VERTEXBUFFER_H

#include "GPUBuffer.h"
#include "Vertex.h"

NS_B2D_BEGIN


////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief	Base class for vertex buffers.
////////////////////////////////////////////////////////////////////////////////////////////////////
class B2D_API VertexBuffer
	: public GPUBuffer
{
protected:
	size_t mVertexSize;
	size_t mVertexCount;
	VertexFormat mVertexFormat;

public:
	VertexBuffer(void);
	virtual ~VertexBuffer(void);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets the size of a vertex.
	///
	/// \return	The vertex size.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	size_t getVertexSize(void) const { return mVertexSize; }
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets vertex count.
	///
	/// \return	The vertex count.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	size_t getVertexCount(void) const { return mVertexCount; }
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Get format of the vertices.
	///
	/// \return	The vertex format.
	/////////////////////////////////////////////////////////////////////////////////////////////////
	VertexFormat getVertexFormat(void) const { return mVertexFormat; }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Resize the vertex buffer.
	///
	/// \param	vertexCount	Number of vertices.
	/// \param	format	   	Describes the format to use.
	/// \param	usage	   	The usage.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void resize(size_t vertexCount, VertexFormat format, BufferUsage usage);

private:
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Get size of a vertex given its format.
	///
	/// \param	format	Format of the vertices.
	///
	/// \return	The size of a vertex.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	static size_t GetVertexSizeFromFormat(VertexFormat format);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Implentation of resizing an index buffer.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void resizeImpl(void) = 0;
};

NS_B2D_END

#endif